package com.crm.service.customerManager;

import com.crm.model.entity.contactManager.Contact;
import com.crm.model.entity.customerManager.*;
import com.crm.model.qo.customerManager.*;
import com.crm.model.qo.opportunityManager.OpportunityQO;
import com.crm.model.vo.contactManager.IndustryAreaVO;
import com.crm.model.vo.csd.customerManager.CustomerMemberCardDetailVO;
import com.crm.model.vo.customerContractManager.CustomerChangeCourseRecordVO;
import com.crm.model.vo.customerContractManager.CustomerContractVO;
import com.crm.model.vo.customerManager.*;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.finishOrderProduct.FinishOrderProductVO;
import com.crm.model.vo.opportunityManager.OpportunityCustomerVO;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;

/**
 * @ Author ：pym
 * @ Date   ：2021/1/18 15:56
 */
public interface CustomerDbService {
    /**
     * 管理模块 -- 客户列表
     *
     * @param customerQO
     * @param sortOrder
     * @return
     */
    List<CustomerVO> selectCustomerList(CustomerQO customerQO, String sortOrder, String companyId);

    /**
     * 根据客户池ID查询客户池下所有客户ID
     *
     * @param customerPoolId
     * @return
     */
    List<String> selectCustomerIdList(String customerPoolId);

    /**
     * 客户详情
     *
     * @param customerPoolId 客户池id
     * @return
     */
    Customer selectCustomerByClueId(String customerPoolId);

    /**
     * 根据客户id查询客户详情
     *
     * @param customerId 客户id
     * @return
     */
    CustomerVO selectByCustomerId(String customerId);

    /**
     * 根据客户Ids删除客户
     *
     * @param customerIds
     * @param deleteStatus
     * @return
     */
    Boolean batchDeleteCustomerByCustomerIds(List<String> customerIds, short deleteStatus);

    /**
     * 根据客户id查询需求分析
     *
     * @param order      分组类型
     * @param customerId 客户id
     * @return
     */
    List<DemandAnalysis> demandAnalysisList(String order, String customerId);

    /**
     * 客户详情-新增需求分析
     *
     * @param xq 需求分析实体类
     * @return
     */
    Boolean addDemandAnalysis(DemandAnalysis xq);

    /**
     * 根据客户Id删除客户
     *
     * @param customer
     * @return
     */
    Boolean deleteCustomerById(Customer customer);

    /**
     * 根据客户Id更新客户
     *
     * @param customer 客户实体
     * @return
     */
    Boolean updateCustomerById(Customer customer);

    /**
     * 用户模块 -- 我的企业客户
     *
     * @param customerQO
     * @param sortOrder
     * @return
     */
    List<CustomerVO> selectMyCustomerList(CustomerQO customerQO, String sortOrder, Integer dateUnit,
                                          Integer tabType, String accountId, String companyId);

    /**
     * 客户详情-修改公司简介
     *
     * @param customerCompanyInfo 公司实体类
     * @return
     */
    boolean updateCustomerCompanyInfo(CustomerCompanyInfo customerCompanyInfo);

    /**
     * 客户详情-新增联系人-名字重复问题       客户下的联系人表
     *
     * @param customerId         客户id
     * @param contactName        联系人姓名
     * @param contactInformation 联系方式
     * @return
     */
    List<CustomerContactPerson> getCustomerIdAndContactName(String customerId, String contactName, String contactInformation);

    /**
     * 添加线索时判断客户是否存在
     */
    Boolean ifExist(String companyName, String unifiedSocialCreditCode);

    /**
     * 根据客户id查询公司联系人信息
     *
     * @param order      分组类型
     * @param customerId 客户id
     * @return
     */
    List<Competitor> competitorList(String order, String customerId);

    /**
     * 新增竞品
     *
     * @param xq 竞品实体类
     * @return
     */
    Boolean addCompetitor(Competitor xq);

    /**
     * 联系人模块 --通过登录人查询客户列表
     *
     * @return
     */
    List<Customer> getCustomerList(String accountId);

    /***
     * @Description:获取会员客户列表
     * @Param: 账号id
     * @Author: luojie
     * @Date: 2021/8/11 15:30
     */
    List<Customer> getMemberCustomerList(String accountId);

    /***
     * @Description:查询非会员合同客户列表
     * @Author: luojie
     * @Date: 2021/4/23 15:06
     */
    List<HashMap> getNonMemberContractCustomerList(String accountId);

    /**
     * 客户退回记录列表
     *
     * @param order      分组类型
     * @param customerId 客户id
     * @return
     */
    List<CustomerReturnVO> customerReturnList(String order, String customerId);

    /**
     * 客户领取记录列表
     *
     * @param order      分组类型
     * @param customerId 客户id
     * @return
     */
    List<CustomerReceiveVO> customerReceiveList(String order, String customerId);

    /**
     * 新增公司资料信息
     *
     * @param customerCompanyInfon 公司资料实体类
     * @return
     */
    boolean addCustomerCompanyInfo(CustomerCompanyInfo customerCompanyInfon);

    /**
     * 客户详情商机管理
     *
     * @param opportunityQO 客户id
     * @return
     */
    List<OpportunityCustomerVO> opportunityByCustomerIdList(OpportunityQO opportunityQO);

    /**
     * 根据用户id查询我的客户总数量
     *
     * @param accountId 用户id
     * @return
     */
    long selectCustomerCountByAccountId(String accountId);

    /**
     * 查询当前客户是否未领取
     *
     * @param customerId 客户id
     * @return
     */
    Boolean checkCustomerIsReceived(String customerId);

    /**
     * 根据客户名称查询重复的客户
     *
     * @param customerName 客户名称
     * @return
     */
    List<CustomerRepeatVO> findRepeatCustomerName(String customerName);

    /**
     * 判断客户是否存在
     *
     * @param customerName            客户名称
     * @param unifiedSocialCreditCode
     * @return
     */
    Customer isCustomerRepeat(String customerName, String unifiedSocialCreditCode);

    /**
     * 查询客户池客户数量
     *
     * @param customerPoolId
     * @return
     */
    long selectCustomerCount(String customerPoolId);

    /**
     * 新增客户
     *
     * @param customer 客户实体类
     * @return
     */
    Boolean insertCustomer(Customer customer);

    /**
     * 去重 查询客户是否一样 通过客户名称和统一社会信用码查询有没有这个客户
     *
     * @param customerName            客户名称
     * @param unifiedSocialCreditCode 同一社会信用码
     * @param accountId               登录人
     * @return
     */
    Boolean customerIdAndUnifiedSocialCreditCode(String customerName, String unifiedSocialCreditCode, String accountId);

    /**
     * 一个用户下最多200个客户
     *
     * @param accountId 用户id
     * @return
     */
    List<Customer> selectCustomerSize(String accountId);

    /**
     * 根据主键查询客户
     *
     * @param customerId 客户id
     * @return
     */
    Customer selectCustomerById(String customerId);

    /**
     * 根据客户Id更新客户
     *
     * @param customer 客户实体类
     * @return
     */
    Boolean updateCustomerByPrimaryKey(Customer customer);

    List<Customer> getCustomerListByComp(String companyId);

    /**
     * 移交资料页面获取客户列表
     *
     * @param moveCustomerQO
     * @param toString
     * @return
     * @Author renshaorong
     * @Date 2021/4/9
     */
    List<CustomerVO> getCustomerListByUserAccountId(MoveCustomerQO moveCustomerQO, String toString);

    /**
     * 批量移动客户给指定用户
     *
     * @param customerList    被选中客户List
     * @param updateAccountId 更新者
     * @return
     * @Author renshaorong
     * @Date 2021/4/9
     */
    boolean moveSelectedCustomers(List<Customer> customerList, String updateAccountId);

    /**
     * 统计客户
     *
     * @param qo
     * @return
     */
    AnalyseCustomerVO analyseCustomer(AnalyseCustomerQO qo);

    /**
     * 查询指定时间范围新客户
     *
     * @param qo
     * @return
     */
    List<Long> selectAnalyseAddCustomer(AnalyseCustomerQO qo);


    /**
     * 获取一个客户
     *
     * @return
     */
    CustomerVO selectOneCustomer();


    /**
     * 成交客户数量
     *
     * @param qo
     * @return
     */
    List<Long> selectMakeCustomerCount(AnalyseCustomerQO qo);

    /**
     * 查询会员成交产品
     *
     * @param qo
     * @return
     */
    BigDecimal selectCustomerVipProductMackCount(AnalyseCustomerQO qo);

    /**
     * 查询非会员成交产品
     *
     * @param qo
     * @return
     */
    BigDecimal selectCustomerProductMackCount(AnalyseCustomerQO qo);

    /**
     * 到期会员
     *
     * @param qo
     * @return
     */
    BigDecimal selectExpireVip(AnalyseCustomerQO qo);


    /**
     * 首页快速查重
     *
     * @param type         类型：1-按客户名称查重；2-按手机号查重
     * @param isVip        是否会员
     * @param checkContent
     * @return
     * @author yuanyunfeng
     * @date 2021/4/19 14:44
     */
    List<CustomerFQRepeatVO> fastQueryRepeat(String type, String isVip, String checkContent);


    /**
     * 首页快速查重（内训）
     *
     * @param type         类型：1-按客户名称查重；2-按手机号查重
     * @param isVip        是否会员
     * @param checkContent
     * @return
     * @Author renshaorong
     * @Date 2021/10/19
     */
    List<CustomerFQRepeatVO> fastQueryRepeatByNx(String type, String isVip, String checkContent);

    /**
     * 判断个人客户是否存在
     *
     * @param enterpriseExternalPhone
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/4/19 16:49
     */
    Boolean isIndividualCustomerRepeat(String enterpriseExternalPhone);

    /**
     * 会员保持率
     *
     * @param year      年份
     * @param companyId
     * @return
     */
    List<Integer> getAnalyseVipHoldRatio(Integer year, String companyId);

    /**
     * 会员流失率
     *
     * @param year      年份
     * @param companyId
     * @return
     */
    List<Integer> getAnalyseVipOutRatio(Integer year, String companyId);

    /**
     * 会员客户数量统计
     *
     * @param startDate
     * @param companyId
     * @return
     */
    VipCustomerAnalyseVO getVipCustomerCount(LocalDate startDate, String companyId);

    /**
     * 会员客户列表
     *
     * @param membershipLevel
     * @param order
     * @return
     */
    List<VipCustomerListVO> selectVipCustomerList(Integer membershipLevel, String order, String companyId);

    /**
     * 联系人列表跳转客户详情-查询是不是自己的客户
     *
     * @param customerId 客户id
     * @return
     */
    boolean selectCustomerSelf(String customerId, String accountId);

    /**
     * 新增商机-客户名称精准匹配
     *
     * @param customerName 客户名称
     * @return
     */
    boolean selectCustomerNameReg(String customerName);

    /**
     * 客户管理 - 单品客户 - 新增单品客户列表
     *
     * @param customerName 客户名称
     * @return {@link {java.util.List<com.crm.model.vo.customerManager.CustomerVO>}}
     * @Author pym
     * @Date 2021/4/30 10:56
     */
    List<CustomerVO> selectSingleProductCustomerList(String customerName, String accountId, String companyId);

    /**
     * qo精确查询客户
     *
     * @param customerQO
     * @return
     */
    List<CustomerVO> selectCustomerPreciseSearch(CustomerQO customerQO);

    /**
     * 获取最大的客户编号
     *
     * @return
     */
    String selectMaxCustomerNumber(String datetime);


    /**
     * 根据客户名称检索数据
     *
     * @param customerName 客户名称
     * @return
     */
    List<DataSearchResultVO> selectDataByCustomerName(String customerName);

    /**
     * 客户管理-客户详情-会员产品-详细信息
     *
     * @param customerId            客户id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CourseVO> selectCustomerProductDetail(String customerId, String finishOrderProductNum);

    /**
     * 新增会员产品详情
     *
     * @param customerProductDetail 会员产品详情
     */
    boolean insertCustomerProductDetail(CustomerProductDetail customerProductDetail);

    /**
     * 客户管理-客户详情-会员产品-课程-产品信息
     *
     * @param customerId 客户Id
     * @param courseNum  课程标号
     * @return
     */
    List<CustomerProductVO> selectCustomerProduct(String customerId, String courseNum);

    /**
     * 我的客户-查询客户里面有的行业
     *
     * @param name   登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @return
     */
    List<IndustryAreaVO> selectIndustry(String name, Integer number);

    /**
     * 我的客户-查询客户里面有的地区
     *
     * @param name   登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @return
     */
    List<IndustryAreaVO> selectProvince(String name, Integer number);

    /**
     * 我的客户-查询客户里面的热门标签
     *
     * @param name   登录人
     * @param number 0超管 1普通管理员  2普通用户
     */
    List<TagVO> selectTag(String name, Integer number);

    /**
     * 查询当前登录人各种状态客户数量
     *
     * @param accountId
     * @return
     */
    AnalyseCustomerRedisVO getAnalyseCustomerIntention(String accountId, Integer dateUnit);

    /**
     * 查询指定时间段的客户数量
     *
     * @param qo
     * @return
     */
    Long selectCustomerCountByAccountIdAndDate(AnalyseCustomerQO qo);

    /**
     * 统计成交客户数量
     *
     * @param qo
     * @return
     */
    Long dealCustomerCount(AnalyseCustomerQO qo);

    /**
     * 客户-客户订单完成的会员产品会员卡
     *
     * @param customerProductDetailMemberCard 客户订单完成的会员产品会员卡实体
     * @return
     */
    Boolean addCustomerProductDetailMemberCard(CustomerProductDetailMemberCard customerProductDetailMemberCard);

    /**
     * 通过会员卡id查询会员卡信息
     *
     * @param customerProductDetailMemberCardId 会员卡id
     * @return
     */
    CustomerProductDetailMemberCard getCustomerProductDetailMemberCardById(String customerProductDetailMemberCardId);

    /**
     * 根据客户名称和账号查询客户
     *
     * @param customerName 客户名称
     * @param accountId    账号ID
     * @return {@link {com.crm.model.entity.customerManager.Customer}}
     * @Author pym
     * @Date 2021/6/1 18:09
     */
    Customer selectCustomerByNameAndId(String customerName, String accountId);

    /**
     * 通过客户id和产品号查询会员卡信息
     *
     * @param customerId            客户id
     * @param finishOrderProductNum 会员卡id
     * @return
     */
    CustomerProductDetailMemberCard getCustomerProductDetailMemberCard(String customerId, String finishOrderProductNum);

    /**
     * 根据用户id查询客户跟进标签前十
     *
     * @param accountId
     * @return
     */
    List<String> selectCustomerFollowTag(String accountId);

    /**
     * 联系人-新增个人联系人--查询同一用户下的联系方式不能一样
     *
     * @param contactName        客户名称
     * @param contactInformation 联系方式
     * @param contactNature      联系人性质  0企业联系人  1非企业联系人
     * @param accountId          用户id
     * @return
     */
    Customer getCustomerNameAndPhone(String contactName, String contactInformation, String contactNature, String accountId);

    /**
     * 通过客户名称和用户id查询这个用户下有这个客户吗
     *
     * @param accountId    用户id
     * @param customerName 客户名称
     * @return
     */
    Customer selectCustomerNameAndAccountId(String accountId, String customerName);

    /**
     * 根据客户名称查询
     *
     * @param customerName
     * @return
     */
    CustomerVO selectCustomerByName(String customerName);

    /**
     * 新增会员卡下的税法直通车数据
     *
     * @param: [customerProductDetailThroughTrainTax] 税法直通车
     * @return: java.lang.Boolean
     * @Author: baijian
     * @Date: 2021/6/21
     */
    Boolean addCustomerProductDetailThroughTrainTax(CustomerProductDetailThroughTrainTax customerProductDetailThroughTrainTax);

    /**
     * 根据会员卡查询下面的税法直通车数据
     *
     * @param customerProductDetailMemberCardId 税法直通车
     * @return
     */
    List<CustomerProductDetailThroughTrainTax> customerProductDetailThroughTrainTaxList(String customerProductDetailMemberCardId);

    /**
     * 根据客户名称和统一社会信用代码查询客户信息
     *
     * @param customerName            客户名称
     * @param unifiedSocialCreditCode 统一社会信用代码
     * @return {@link {com.crm.model.entity.customerManager.Customer}}
     * @Author pym
     * @Date 2021/7/1 13:34
     */
    Customer selectCustomerByNameAndCode(String customerName, String unifiedSocialCreditCode);

    /**
     * 去Redis判断客户名称是否存在
     *
     * @param customerName 客户名称
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/7/1 14:25
     */
    Boolean isCustomerExist(String customerName);

    /**
     * 根据客户名称去Redis查统一社会信用代码
     *
     * @param customerName 客户名称
     * @return {@link {java.lang.String}}
     * @Author pym
     * @Date 2021/7/1 14:45
     */
    String selectUnifiedSocialCreditCode(String customerName);

    /**
     * 根据客户名称和联系人电话查询客户信息
     *
     * @param customerName       客户名称
     * @param contactPersonPhone 联系人电话
     * @return {@link {com.crm.model.entity.customerManager.Customer}}
     * @Author pym
     * @Date 2021/7/2 11:23
     */
    Customer selectCustomerByNameAndPhone(String customerName, String contactPersonPhone);

    /**
     * 个人客户去重
     *
     * @param customerName 客户姓名
     * @param accountId    用户id
     * @param customerType 客户类型  0企业客户 1个人客户
     * @return
     */
    CustomerVO selectCustomerByNameAndAccountId(String customerName, String accountId, String customerType, String companyId);

    /**
     * 更新给定字段，字段为空时不更新
     *
     * @param customer
     * @return
     * @Author renshaorong
     * @Date 2021/7/12
     */
    boolean updateByPrimaryKeySelective(Customer customer);

    /**
     * 信息错误页面
     *
     * @param customerQO
     * @param sortOrder
     * @return
     */
    List<CustomerVO> selectInfomationErrorList(CustomerQO customerQO, String sortOrder);

    /**
     * 通过用户id获取企业客户
     *
     * @param accountId
     * @return
     */
    List<Customer> getCompCustomerList(String accountId, String order);

    /**
     * 获取会员客户数量
     *
     * @param year
     * @param companyId
     * @return
     */
    List<Integer> getCustomerCount(Integer year, String companyId);

    /**
     * 根据统一社会信用代码查询客户信息
     *
     * @param unifiedSocialCreditCode 信用代码
     * @return
     */
    Customer selectCustomerByCode(String unifiedSocialCreditCode);

    /**
     * 查询当月流失会员数量
     *
     * @param month
     * @param companyId
     * @return
     */
    Integer selectThisMonthOutVip(String month, String companyId);

    /**
     * 当月会员数量
     *
     * @param month
     * @param companyId
     * @return
     */
    Integer selectThisMonthVipCount(String month, String companyId);

    /**
     * 查询我的客户非会员客户数量
     *
     * @param accountId 账号Id
     * @return {@link {long}}
     * @Author pym
     * @Date 2021/7/20 16:38
     */
    long selectNonmemberCustomerCountByAccountId(String accountId);

    Map<String, Object> getPoolType(String customerId);

    /**
     * 新增兑换码
     *
     * @param ex 兑换码
     * @return
     */
    Boolean addCustomerProductDetailExchangeCode(CustomerProductDetailExchangeCode ex);

    /**
     * 新增云顾问卡
     *
     * @param yun 云顾问卡
     * @return
     */
    Boolean addCustomerProductDetailYun(CustomerProductDetailYun yun);

    /**
     * 根据订单id和产品编码查询会员卡信息
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailMemberCard> getMemberCardByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 根据订单id和产品编码查询税法直通车信息
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailThroughTrainTax> getThroughTrainTaxByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 根据订单id和产品编码查询兑换码信息
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailExchangeCode> getExchangeCodeByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 根据订单id和产品编码查询云顾问卡信息
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailYun> getYunByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 查询客户名称和统一社会信用代码不为空的客户
     *
     * @param
     * @return {@link {java.util.List<com.crm.model.entity.customerManager.Customer>}}
     * @Author pym
     * @Date 2021/7/21 13:30
     */
    List<Customer> getAllCustomerWhereNameAndCreditCodeNotNull();

    /**
     * 先查Redis判断客户是否存在
     *
     * @param customerName            客户名称
     * @param unifiedSocialCreditCode 统一社会信用代码
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/8/3 14:53
     */
    Boolean selectCustomerIfRepeated(String customerName, String unifiedSocialCreditCode);

    /**
     * 新增充值卡
     *
     * @param ex 充值卡
     * @return
     */
    Boolean addCustomerProductDetailRechargeCode(CustomerProductDetailRechargeCode ex);

    /**
     * 新增优惠劵
     *
     * @param c 优惠劵
     */
    Boolean addCustomerProductDetailCoupon(CustomerProductDetailCoupon c);

    /**
     * 查询充值卡通过订单id和产品号
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailRechargeCode> getRechargeCodeByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 查询优惠劵通过订单id和产品号
     *
     * @param orderId               订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<CustomerProductDetailCoupon> getCouponsByOrderIdAndCph(String orderId, String finishOrderProductNum);

    /**
     * 获取客户下对应的联系人
     *
     * @param customerId 客户Id
     * @return {@link {java.util.List<com.crm.model.entity.customerManager.CustomerContactPerson>}}
     * @Author pym
     * @Date 2021/8/6 9:04
     */
    List<CustomerContactPerson> getCustomerContactPersonByCustomerId(String customerId);

    /**
     * 俺的客户列表
     *
     * @param customerQO
     * @param order
     * @return
     */
    List<CustomerVO> selectMeCustomerList(CustomerQO customerQO, String order);

    /**
     * selectCustomerMemberCardDetailByProductOrderId
     *
     * @param productOrderId        订单id
     * @param finishOrderProductNum 产品号
     * @return
     * @Author wangpeng
     * @Date 2021/9/16
     */
    CustomerMemberCardDetailVO selectCustomerMemberCardDetailByProductOrderId(String productOrderId, String finishOrderProductNum);

    /**
     * updatechsCustomerMemberCardDetail
     * 修改会员卡的次数 进行扣次
     *
     * @param hyhsycs                           行业会次数
     * @param xcch                              现场天数
     * @param accountId                         更新用户id
     * @param memberCardNumber1                 会员卡卡号
     * @param customerProductDetailMemberCardId 会员卡id
     * @return
     * @Author wangpeng
     * @Date 2021/9/16
     */
    void updatechsCustomerMemberCardDetail(String hyhsycs, String xcch, String accountId, String memberCardNumber1, String customerProductDetailMemberCardId);

    /**
     * addCustomerChangeCourseRecord
     * 新增兑换记录
     *
     * @param vo
     * @return
     * @Author wangpeng
     * @Date 2021/9/22
     */
    void addCustomerChangeCourseRecord(CustomerChangeCourseRecordVO vo);

    /**
     * 内训部-客户公海
     *
     * @param customerQO
     * @param sortOrder
     * @return
     * @Author renshaorong
     * @Date 2021/9/6
     */
    List<CustomerVO> selectCustomerVOListForInT(CustomerQO customerQO, String sortOrder);

    List<CustomerVO> selectCustomerVOListByOwner(CustomerQO customerQO, String ownerId, Integer dateUnit, String sortOrder);

    /**
     * addFinishOrderProduct
     *
     * @param f
     * @return
     * @Author wangpeng
     * 新增一条数据到finish
     * @Date 2021/9/26
     */
    void addFinishOrderProduct(FinishOrderProductVO f);


    /**
     * selectFinishOrderProductById
     *
     * @param finishOrderProductId
     * @return
     * @Author wangpeng
     * 根据id查询Finish表
     * @Date 2021/9/26
     */
    FinishOrderProductVO selectFinishOrderProductById(String finishOrderProductId);

    String selectCustomerIdByName(String customerName);

    /**
     * 获取内训下的客户
     *
     * @return
     */
    List<CustomerVO> getCustomerUserList(String accountId);

    /**
     * 通过客户名称查询客户
     *
     * @param customerName 客户名称
     * @return
     */
    Customer selectByCustomerName(String customerName);

    /**
     * selectChangeCourseCecord
     *
     * @param memberCardNumber 会员卡卡号
     * @return
     * @Author wangpeng
     * @Date 2021/10/21
     */
    CustomerChangeCourseRecordVO selectChangeCourseCecord(String memberCardNumber);

    List<CustomerChangeCourseRecordVO> selectChangeCourseCecordList(String memberCardNumber);

    /**
     * 客户详情会员卡
     *
     * @return
     */
    List<CardVO> selectCardByCustomerIdList(String customerId);


    /**
     * 会员成交产品
     */
    List<CustomerAnalysisQo> memberTransactionProducts(CustomerAnalysisRequestQo qo);

    /**
     * 非会员成交产品
     */
    List<CustomerAnalysisQo> nonMemberTransactionProducts(CustomerAnalysisRequestQo qo);

    /**
     * 新增会员
     */
    List<CustomerAnalysisQo> newMember(CustomerAnalysisRequestQo qo);

    /**
     * 新增会员
     */
    List<CustomerAnalysisQo> renewMember(CustomerAnalysisRequestQo qo);

    /**
     * 新增会员
     */
    List<CustomerAnalysisQo> expiredMember(CustomerAnalysisRequestQo qo);

    /**
     * 新增会员
     */
    List<Long> everyDayDealMember(String companyId, String userId, String contractType);

    /**
     * 用户端 - 客户公海 - 分公司 筛选列表
     * @Author pym
     * @Date  2021/11/23 11:26
     * @param
     * @return {@link {java.util.List<com.crm.model.vo.customerManager.CustomerPoolNameVO>}}
     */
    List<CustomerPoolNameVO> selectCustomerPoolNameList();

    /**
     * 用户端 - 客户公海 - 地区 筛选列表
     * @Author pym
     * @Date  2021/11/23 11:40
     * @param customerPoolId -客户池Id
     * @return {@link {java.util.List<java.lang.String>}}
     */
    List<String> selectProvinceNameList(String customerPoolId);

    /**
     * 用户端 - 客户公海 - 标签 筛选列表
     * @Author pym
     * @Date  2021/11/23 14:22
     * @param customerPoolId -客户池Id
     * @return {@link {java.util.List<java.lang.String>}}
     */
    List<String> selectTagList(String customerPoolId);

    /**
     * 用户端 - 客户公海 - 客户池下客户列表
     * @Author pym
     * @Date  2021/11/23 15:43
     * @param poolCustomerQO -筛选条件
     * @param sortOrder -排序
     * @return {@link {java.util.List<com.crm.model.vo.customerManager.PoolCustomerVO>}}
     */
    List<PoolCustomerVO> selectPoolCustomerList(PoolCustomerQO poolCustomerQO, String sortOrder);
    /**
     * 客户详情税法直通车
     * @param customerId
     * @return
     */
    List<TaxCardVO> selectTaxCardByCustomerIdList(String customerId);

    /**
     * 通过卡号查询
     * @param memberCardNumber
     * @return
     */
    List<CustomerProductDetailThroughTrainTax> selectTaxNumber(String memberCardNumber);

    /**
     * 修改税法直通车
     * @param tra
     * @return
     */
    Boolean updateCustomerProductDetailThroughTrainTax(CustomerProductDetailThroughTrainTax tra);

    /**
     * 查询客户会员开始时间和结束时间
     * @return
     */
    List<CustomerMemberDateVO> selectCustomerMemberDate();

    /**
     * 修改合同状态  改为已结束
     */
    List<CustomerMemberDateVO> selectContractStatus();

    /**
     * 用户端 - 客户公海 - 行业 筛选列表
     * @Author pym
     * @Date  2021/12/10 11:02
     * @param customerPoolId - 客户池Id
     * @return {@link {java.util.List<java.lang.String>}}
     */
    List<String> selectIndustryList(String customerPoolId);

    /**
     * 通过充值卡卡号查询
     * @param card
     * @return
     */
    CustomerProductDetailRechargeCode selectRechargeCode(String card);

    /**
     * 修改充值卡
     * @param rechargeCode
     */
    Boolean updateRechargeCode(CustomerProductDetailRechargeCode rechargeCode);

    /**
     * 修改会员卡
     * @param card
     */
    Boolean updateCustomerProductDetailMemberCard(CustomerProductDetailMemberCard card);

    /**
     * 通过兑换码查询
     * @param card
     * @return
     */
    CustomerProductDetailExchangeCode selectExchangeCode(String card);

    /**
     * 修改兑换码
     * @param exchangeCode
     */
    Boolean updateExchangeCode(CustomerProductDetailExchangeCode exchangeCode);

    /**
     * 查询会员过期时间小于现在的
     * @param date
     * @return
     */
    List<CustomerVO> selectMembershipExpirationTm(Date date);

    /**
     * 查询生效中会员合同最大到期时间
     * @return
     */
    List<CustomerContractVO> selectContractEndDate();

    /**
     * 查询某个池下客户数量
     * @param id
     * @return
     */
    int selectCountById(String id);

    /**
     * 根据公司名、统一信用代码校验重复
     * @param name
     * @param code
     * @return
     */
    int selectCountByNameByCode(String name,String code);


    /**
     * 修改客户的会员等级和流失客户
     * @param customer
     * @return
     */
    Boolean updateCustomerByIdSql(Customer customer);

    /**
     * 通过卡号查找
     * @param cardNumber
     * @return
     */
    CustomerProductDetailMemberCard selectCardByNumber(String cardNumber);


    /**
     * 客户调转-流转记录
     * @param customerName 客户名称
     * @return
     */
    List<CustomerTransferRecordVo> selectCustomerTransferRecordList(String customerName);


    /**
     * 通过客户编号查询
     * @param customerNumber
     * @return
     */
    Customer selectByCustomerNumber(String customerNumber);
}
